package com.platform.enums;

import com.fasterxml.jackson.annotation.JsonValue;
import com.google.common.base.Strings;
import com.platform.comm.constants.EnumOption;
import com.platform.comm.enums.IEnumOption;

import java.util.Arrays;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;
import java.util.stream.Stream;

/**
 * 字段 类型枚举
 *
 * @author coder
 */
@EnumOption
public enum CommFlagType implements IEnumOption<String> {
    // 初始状态
    Initial("初始", "I"),
    // 启用状态
    Enabled("启用", "Y"),
    // 禁用状态
    Disabled("禁用", "D"),
    // 锁定状态
    Locked("锁定", "L"),
    // 密码过期
    PwdExpire("密码过期", "P");

    private String fname;
    private String fvalue;

    CommFlagType(String fname, String fvalue) {
        this.fname = fname;
        this.fvalue = fvalue;
    }

    public String getFname() {
        return fname;
    }

    @JsonValue
    public String getFvalue() {
        return this.fvalue;
    }

    /**
     * 根据值返回枚举
     *
     * @param value 标识代码
     * @return 标识枚举
     */
    public static CommFlagType getFlagByValue(String value) {
        if (value.equals(CommFlagType.Disabled.fvalue)) {
            return Disabled;
        } else if (value.equals(CommFlagType.Enabled.fvalue)) {
            return Enabled;
        } else if (value.equals(CommFlagType.Initial.fvalue)) {
            return Initial;
        } else if (value.equals(CommFlagType.Locked.fvalue)) {
            return Locked;
        } else {
            return PwdExpire;
        }
    }

    /**
     * 返回枚举名称列表
     *
     * @param hasInit true 返回"初始",反之不返回
     * @return 返回名称列表
     */
    public static List<String> getNames(boolean hasInit) {
        return Stream.of(values()).filter(item -> !item.fvalue.equals(Initial.fvalue) || hasInit)
                .map(CommFlagType::getFname).collect(Collectors.toList());
    }

    /**
     * 返回枚举名称列表
     *
     * @param hasInit true 返回"初始",反之不返回
     * @return 返回值列表
     */
    public static List<String> getValues(boolean hasInit) {
        return Stream.of(values()).filter(item -> !item.fvalue.equals(Initial.fvalue) || hasInit)
                .map(CommFlagType::getFvalue).collect(Collectors.toList());
    }

    /**
     * @param type :norm(启用、禁用), init（启用、禁用、初始化）, all（初始化、启用、禁用、锁定、密码过期）
     * @return 返回枚举映射
     */
    public static Map<String, String> getCommFlagStatus(String type) {
        if (Strings.isNullOrEmpty(type)) {
            type = "norm";
        }
        Map<String, String> commStatus = new HashMap<>();
        for (int i = 0; i < values().length; i++) {
            commStatus.put(values()[i].fvalue, values()[i].fname);
        }
        switch (type) {
            case "norm":
                commStatus.remove(Initial.fvalue);
                commStatus.remove(Locked.fvalue);
                commStatus.remove(PwdExpire.fvalue);
                break;
            case "init":
                commStatus.remove(Locked.fvalue);
                commStatus.remove(PwdExpire.fvalue);
                break;
            default:
        }

        return commStatus;
    }

    /**
     * 枚举项 “键”
     *
     * @return key
     */
    @Override
    public String key() {
        return this.fvalue;
    }

    /**
     * 枚举项 “值”
     *
     * @return value
     */
    @Override
    public String value() {
        return this.fname;
    }

    /**
     * 枚举options
     *
     * @return
     */
    @Override
    public Map<String, String> enums() {
        return Arrays.stream(values()).collect(Collectors.toMap(IEnumOption::key, IEnumOption::value));
    }
}
